Link National Oil Company Database

library(readr)
library(tidyverse)
library(ggplot2)
library(plotly)
library(lubridate)
source("functiones_hidrocarburos.R")
options (scipen = 999)
  
#cargo la base
nocs_full <- read_csv( "../data/nocs/NRGI-NOCdatabase-FullDataset.csv") %>% 
   mutate(observation = as.double(observation),
          anio = (as.Date(parse_date_time(year, orders  = "%Y"))))

hidrocarburos_df <- read_csv("../data/balances/hidrocarburos_df.csv") %>% 
  select(-"...1")  
 
  
  

Variables que contiene la base

variables = unique(nocs_full$indicatorName)
variables
 [1] "Any shares publicly traded?"                                                      
 [2] "Auditor opinion issued with qualification?"                                       
 [3] "Bonus payments"                                                                   
 [4] "Capex (company-wide) per barrel"                                                  
 [5] "Capex / total revenue"                                                            
 [6] "Capital expenditures"                                                             
 [7] "Cash and cash equivalents"                                                        
 [8] "Cash flows from financing activities"                                             
 [9] "Cash flows from investing activities"                                             
[10] "Cash flows from operating activities"                                             
[11] "Cash ratio"                                                                       
[12] "Country released EITI report for this year?"                                      
[13] "Current assets"                                                                   
[14] "Current liabilities"                                                              
[15] "Dividends"                                                                        
[16] "Domestic oil, gas & product sales"                                                
[17] "Domestic sales"                                                                   
[18] "Employees"                                                                        
[19] "Equity"                                                                           
[20] "Exchange rate"                                                                    
[21] "Exploration - Seismic (2D)"                                                       
[22] "Exploration - Seismic (3D and 4D)"                                                
[23] "External oil, gas & product sales"                                                
[24] "External sales"                                                                   
[25] "Fiscal payments from contractors"                                                 
[26] "Gas production"                                                                   
[27] "Gas production of home country"                                                   
[28] "GDP"                                                                              
[29] "General government revenue"                                                       
[30] "General government total expenditure"                                             
[31] "Government gross debt"                                                            
[32] "Government resource revenue / general government revenue"                         
[33] "Government transfers"                                                             
[34] "Income tax"                                                                       
[35] "Longterm/fixed assets"                                                            
[36] "National gas reserves"                                                            
[37] "National oil and gas reserves"                                                    
[38] "National oil reserves"                                                            
[39] "Natural capital, subsoil assets: oil & gas"                                       
[40] "Net income after taxes"                                                           
[41] "Net income after taxes/equity"                                                    
[42] "Net income after taxes/revenue"                                                   
[43] "Net income after taxes / total assets"                                            
[44] "Net income from all revenues (before transfers to govt.)"                         
[45] "Net income from core revenues (before transfers to govt.)"                        
[46] "Net income per employee"                                                          
[47] "Net income / total revenue (before transfers to govt.)"                           
[48] "NOC debt / government gross debt"                                                 
[49] "NOC has stake in fields abroad?"                                                  
[50] "NOC net income / general government revenue"                                      
[51] "NOC oil and gas production / oil and gas production of home country"              
[52] "NOC operator of any production?"                                                  
[53] "NOC operator of fields abroad?"                                                   
[54] "NOC reserves / national oil and gas reserves"                                     
[55] "NOC total assets / total national wealth"                                         
[56] "NOC total revenues / GDP"                                                         
[57] "NOC total revenues / general government revenues"                                 
[58] "NOC transfers to government / general government revenue"                         
[59] "NOC transfers to government / NOC net income"                                     
[60] "NOC transfers to government / total NOC revenues"                                 
[61] "NOC transfers to government / total public expenditures"                          
[62] "O&G production / total reserves"                                                  
[63] "O&G revenue per barrel of production"                                             
[64] "O&G revenue per barrel of reserves"                                               
[65] "O&G revenue per employee"                                                         
[66] "Oil and gas production of home country"                                           
[67] "Oil & gas production"                                                             
[68] "Oil, gas & product sales"                                                         
[69] "Oil production"                                                                   
[70] "Oil production of home country"                                                   
[71] "Operational expenditures"                                                         
[72] "Opex (company-wide) per barrel"                                                   
[73] "Opex / total revenue"                                                             
[74] "Other transfers to government"                                                    
[75] "Percentage non-core activities in total revenue"                                  
[76] "Proceeds of state profit/equity petroleum"                                        
[77] "Production on which NOC is operator"                                              
[78] "Production per employee"                                                          
[79] "Report audited by independent external auditor?"                                  
[80] "Report presented according to International Financial Reporting Standards (IFRS)?"
[81] "Reserves"                                                                         
[82] "Reserves per employee"                                                            
[83] "Reserves / production ratio"                                                      
[84] "Return on capital employed (before transfers to govt.)"                           
[85] "Revenue - Non core activities"                                                    
[86] "Rigs"                                                                             
[87] "Royalties"                                                                        
[88] "Total assets"                                                                     
[89] "Total liabilities"                                                                
[90] "Total longterm/fixed liabilities"                                                 
[91] "Total national wealth"                                                            
[92] "Total revenue"                                                                    
[93] "Total revenue per barrel of production"                                           
[94] "Total revenue per employee"                                                       
[95] "Total transfers to government"                                                    
[96] "Transfers to government per barrel"                                               
[97] "Wells drilled"                                                                    

Lista de todas las empresas

#empresas disponibles
unique(nocs_full$company)
 [1] "ADNOC"              "BAPCO"              "Basra Oil Company"  "CNOOC"              "CNOOC Limited"      "CNPC"              
 [7] "CUPET"              "Ecopetrol"          "EGPC"               "ENH"                "ENOC"               "Equinor"           
[13] "ETAP"               "Gabon Oil Company"  "Gazprom"            "GEPetrol"           "GNPC"               "IPIC"              
[19] "KazMunayGas"        "KPC"                "MOGE"               "Naftogaz"           "NAMCOR"             "National Oil Kenya"
[25] "Nilepet"            "NIOC"               "NNPC"               "NOCAL"              "NOC Libya"          "ONGC"              
[31] "OOC"                "Orsted"             "PCJ"                "PDVSA"              "Pemex"              "Pertamina"         
[37] "Perupetro"          "Petroamazonas"      "Petrobangla"        "Petrobras"          "PetroChina"         "Petroci"           
[43] "Petroecuador"       "PetroleumBrunei"    "Petronas"           "PetroSA"            "Petrotrin"          "PetroVietnam"      
[49] "PNOC"               "PTT"                "Qatar Petroleum"    "Rosneft"            "Saudi Aramco"       "SHT"               
[55] "Sinopec Corp"       "Sinopec Group"      "SNH"                "SNPC"               "SOCAR"              "Sonahydroc"        
[61] "Sonangol"           "Sonatrach"          "Staatsolie"         "Sudapet"            "TAQA"               "Timor GAP"         
[67] "TPDC"               "Turkmengaz"         "YOGC"               "YPF"                "YPFB"              

Cantidad de empresas

length(unique(nocs_full$company))
[1] 71
#filtro exploratorio de empresas 
filtro_empresas <- c("YPF", "Petrobras", "YPFB", "PDVSA", "Saudi Aramco")
#filtro con empresas de América Latina
empresas_AL <- nocs_full %>% 
  filter(region ==  "Latin America/Caribbean") %>% 
  select(company, country) 
empresas_AL <- empresas_AL[!duplicated(empresas_AL), ]

empresas_AL
NA

ProducciĂ³n

production_graf <-  nocs_full %>% 
  filter(indicatorName %in% c("Oil production", "Gas production")) %>% 
  mutate(observation = observation / 1000000,
         id = 1:nrow(.)) %>%
  group_by(company, indicatorName, year, region ) %>% 
  mutate(observation = sum(observation, na.rm = T)) %>% 
  ggplot(aes(year, observation , color = company))+
  geom_point(size = 0.8, alpha = 0.9, aes(shape = country))+
  labs(title =  "Oil & gas production",
       x = "Año", y = "Millons de barriles de petrĂ³leo equivalente/dĂ­a")+
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 90, hjust = 1))+
  facet_grid(indicatorName~region, labeller = label_wrap_gen(width=17))
ggplotly(production_graf)
The shape palette can deal with a maximum of 6 discrete values because more than 6 becomes difficult to discriminate; you have 61.
Consider specifying shapes manually if you must have them.

Activo y Patrimonio Neto

assets_graf <-  nocs_full %>% 
  filter(indicatorName %in% c( "Total assets"),
         year == 2017, units == "USD million",
         !is.na(observation)) %>%
  ggplot(aes(x = reorder(company,-observation) , y= observation, fill = company))+
  geom_col(position = "stack")+
  labs(title =  "Total assets",
       x = "Empresa", y = "MM USD")+
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 90, hjust = 1))
  # facet_grid(indicatorName~region, labeller = label_wrap_gen(width=17))
ggplotly(assets_graf)
NA
assets_graf <-  nocs_full %>% 
  filter(indicatorName %in% c( "Equity"),
         year == 2017, units == "USD million",
         !is.na(observation)) %>%
  ggplot(aes(x = reorder(company,-observation) , y= observation, fill = company))+
  geom_col(position = "stack")+
  labs(title =  "Total Equity", subtitle= "Year 2017",
       x = "Empresa", y = "MM USD")+
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 90, hjust = 1))
  # facet_grid(indicatorName~region, labeller = label_wrap_gen(width=17))
ggplotly(assets_graf)

InversiĂ³n en capital

capex_graf <-  nocs_full %>% 
  filter(indicatorName %in% c("Capital expenditures"), units == "USD million") %>%
  ggplot(aes(x = year, y= observation, color = company))+
  geom_line(aes(linetype = country))+
  labs(title =  "Capital expenditures (CAPEX)",
       x = "Año", y = "MM USD")+
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 90, hjust = 1),
        strip.text.y = element_text(size = 7))+
  facet_grid(~region, labeller = label_wrap_gen(width=15))

ggplotly(capex_graf)

Rentabilidad

Data Frame con indicadores


#para cĂ¡lculo de rentabilidad
nocs_df <- nocs_full %>%
  select(year, company, region, country, productionGroup, indicatorName, units, observation) %>% 
  filter(indicatorName %in% c("Longterm/fixed assets", "Cash and cash equivalents",
                               "Net income after taxes", "Income tax",
                              "Equity","Total assets", 
                              "Total liabilities" , "Current liabilities" ),
         units == "USD million") %>%
  mutate(row_id = 1:nrow(.)
         # , observation = as.double(observation)
         ) %>%
  spread(.,
         key = indicatorName,
         value = observation) %>% 
  select(-c(row_id)) %>% 
  rename( fixed_assets = "Longterm/fixed assets", cash_and_equi = "Cash and cash equivalents",
         net_income_after_tax = "Net income after taxes" , income_tax = "Income tax",
         equity = "Equity",  assets = "Total assets",
         liabilities = "Total liabilities", current_liabilities = "Current liabilities") %>% 
  mutate(net_income_after_tax = as.double(net_income_after_tax),
         fixed_assets = as.double(fixed_assets),
         cash_and_equi = as.double(cash_and_equi),
         income_tax = as.double(income_tax),
         equity = as.double(equity),
         liabilities = as.double(liabilities),
         year = parse_date_time(year, orders = "y")) %>% 
  group_by(year, company, country, region, productionGroup, units) %>%
  summarise(fixed_assets = sum(fixed_assets, na.rm = T),
            cash_and_equi = sum(cash_and_equi, na.rm = T),
            net_income_after_tax = sum(net_income_after_tax, na.rm = T),
            income_tax = sum(income_tax, na.rm =  T),
            assets = sum(assets, na.rm =  T),
            liabilities = sum(liabilities, na.rm =  T),
            current_liabilities = sum(current_liabilities, na.rm =  T),
            equity = sum(equity, na.rm =  T),
            KTA = cash_and_equi + fixed_assets,
            tg_beforetax = (income_tax + net_income_after_tax) / KTA,
            tg_aftertax = net_income_after_tax / KTA,
            ratio_endeudamiento = liabilities / equity, 
            ratio_endeudamiento_cp = current_liabilities/equity,
            pasivo_activo = liabilities/assets,
            ratio_solvencia =  equity /liabilities) 

# nocs_df %>% arrange(-tg_aftertax) %>% 
#   select(company, KTA, tg_aftertax)

nocs_df

nocs_df[sapply(nocs_df, is.infinite)] <- NA

Rentabilidad media de la rama

tg_media <- nocs_df %>%
    group_by(year) %>% 
    summarise(
                  tg_media_before_tax = sum(income_tax, net_income_after_tax, na.rm =  T)/ 
                                                        sum(fixed_assets, cash_and_equi, na.rm = T),
                  tg_media_after_tax = sum(net_income_after_tax, na.rm =  T) / 
                                                        sum(fixed_assets, cash_and_equi, na.rm = T)) %>% 
                  # tg_media_before_tax_mean = sum(mean(income_tax, na.rm =  T), 
                  #                                mean(net_income_after_tax, na.rm = T), na.rm = T)/ 
                  #                             sum(mean(fixed_assets, na.rm = T), 
                  #                                 mean(cash_and_equi, na.rm = T), na.rm = T),
                  # tg_media_after_tax_mean = mean(net_income_after_tax, na.rm = T)/ 
                  #                             sum(mean(fixed_assets, na.rm = T), 
                  #                                 mean(cash_and_equi, na.rm = T), na.rm = T)) %>% 
     gather(.,
               key = variable,
               value = valor, 
               2:3) 
    # mutate(metodo = case_when( str_sub(variable[-3])))
                

tg_media_graf <- tg_media %>% 
  # filter(variable == "tg_media_before_tax_mean") %>% 
  ggplot(aes(year, valor, color = variable))+
  geom_line()+
  labs(title =  "NOC's. Tasa de Ganancia media")+
  theme(legend.position = "bottom")+
  scale_y_continuous(labels = scales::percent)
tg_media_graf

NA
nocs_df_con_media <- nocs_df %>% 
  bind_rows(tg_media %>% 
              spread(key = variable,
                     value = valor) %>% 
              mutate(company = "TG Media") %>% 
              rename(tg_beforetax = tg_media_before_tax,
                     tg_aftertax = tg_media_after_tax)) %>% 
  mutate(is_media = case_when(company == "TG Media" ~ "media",
                              TRUE ~ "empresas"))

write.csv(nocs_df_con_media, file = "../resultados/comparacion_paises/nocs_df_con_media.csv")

graf_media_line <- nocs_df_con_media %>% 
  ggplot(aes(year, tg_aftertax, color = company, group = is_media))+
  geom_line()+
  geom_point()+
  labs(title =  "NOC's. Rentabilidad media y del resto de las empresas después de impuestos")+
  theme(legend.position = "none")+
  scale_y_continuous(labels = scales::percent, limits = c(-0.30, 0.70),breaks = seq(-0.30, 0.70, .1))
graf_media_line

graf_media_box <- nocs_df %>% 
  # ggplot(aes(year, tg_aftertax, color = company, size = is_media))+
  ggplot(aes(year, tg_aftertax, color = company, group = year))+
  geom_boxplot()+
  # ggplot(aes(data = nocs_df_con_media %>% filter(company == "TG Media"), year, tg_aftertax))+
  # geom_line()+
  labs(title =  "NOC's. Rentabilidad despues de impuestos")+
  theme(legend.position = "none")+
  scale_y_continuous(labels = scales::percent, limits = c(-0.3, .8), breaks = seq(-0.3, .8, 0.1))
graf_media_box

summary(nocs_df %>% 
  group_by(year, productionGroup) %>% 
  summarise(tg_aftertax = mean(tg_aftertax, na.rm = T)) %>% 
  spread(.,
         key = productionGroup,
         value =  tg_aftertax))
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
      year                     Internationalized operators Large domestic producers Medium domestic producers Pre-production NOCs
 Min.   :2011-01-01 00:00:00   Min.   :0.0921              Min.   :0.1214           Min.   :0.03228           Min.   :-0.19649   
 1st Qu.:2012-10-01 12:00:00   1st Qu.:0.1124              1st Qu.:0.1677           1st Qu.:0.13562           1st Qu.:-0.03020   
 Median :2014-07-02 12:00:00   Median :0.1327              Median :0.2683           Median :1.35633           Median : 0.05986   
 Mean   :2014-07-02 12:00:00   Mean   :0.1424              Mean   :0.2681           Mean   :1.46370           Mean   : 0.20272   
 3rd Qu.:2016-04-01 12:00:00   3rd Qu.:0.1706              3rd Qu.:0.3280           3rd Qu.:2.72462           3rd Qu.: 0.13376   
 Max.   :2018-01-01 00:00:00   Max.   :0.2127              Max.   :0.4527           Max.   :3.17724           Max.   : 1.48343   
 Small domestic producers
 Min.   :-7.1290         
 1st Qu.: 0.0129         
 Median : 0.2032         
 Mean   :-0.6546         
 3rd Qu.: 0.3530         
 Max.   : 0.7303         

Rentabilidad segĂºn tamaño

tg_graf_prod_group <- nocs_df %>% 
  # filter(tg_aftertax != 0 & fixed_assets > 0 & tg_aftertax < 5 & tg_aftertax > -20 ) %>%  
  ggplot(aes(year, tg_aftertax, color = company))+
  geom_line()+
  labs(title =  "NOC's. Rentabilidad despues de impuestos. DivisiĂ³n por tamaño")+
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 90, hjust = 1))+
  scale_y_continuous(labels = scales::percent, limits = c(-0.3, .8), breaks = seq(-0.3, .8, 0.20))+
  facet_grid(~productionGroup,  labeller = label_wrap_gen(width=17))
plotly::ggplotly(tg_graf_prod_group)

Rentabilidad segĂºn regiĂ³n

tg_graf_xregion <- nocs_df %>% 
  filter(tg_aftertax != 0 & fixed_assets > 0 & tg_aftertax < 1 & tg_aftertax > -20 ) %>%
  ggplot(aes(year, tg_aftertax, color = company))+
  geom_line()+
  labs(title =  "NOC's. Rentabilidad despues de impuestos. DivisiĂ³n por regiĂ³ns")+
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 90, hjust = 1))+
  scale_y_continuous(labels = scales::percent)+
  facet_grid(~region,  labeller = label_wrap_gen(width=17))

plotly::ggplotly(tg_graf_xregion)
NA

YPF, Petrobras y empresas seleccionadas

filtro_emp_df <-  nocs_df  %>%
  ungroup() %>% 
  mutate(company = case_when(!(company %in% filtro_empresas) ~ "Media (resto de empresas)",
                             T ~ company)) %>% 
  group_by(year, company) %>%
  summarise(fixed_assets = sum(fixed_assets, na.rm = T),
            cash_and_equi = sum(cash_and_equi, na.rm = T),
            net_income_after_tax = sum(net_income_after_tax, na.rm = T),
            income_tax = sum(income_tax, na.rm =  T),
            liabilities = sum(liabilities, na.rm =  T),
            equity = sum(equity, na.rm =  T),
            KTA = cash_and_equi + fixed_assets,
            tg_beforetax = (income_tax + net_income_after_tax) / KTA,
            tg_aftertax = net_income_after_tax / KTA,
            ratio_endeudamiento = liabilities / equity, 
            ratio_solvencia =  equity /liabilities)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
filtro_emp_df


tg_filtro_graf <- filtro_emp_df %>% 
  filter(tg_aftertax != 0 & fixed_assets > 0 & tg_aftertax < 5 & tg_aftertax > -20 ) %>%  
  ggplot(aes(year, tg_aftertax, color = company))+
  geom_line()+
  labs(title =  "Rentabilidad",
       subtitle =  "Empresas seleccionadas")+
  # theme(legend.position = "none")+
  # facet_wrap(~productionGroup)+
  scale_y_continuous(labels = scales::percent)

  
ggplotly(tg_filtro_graf)
tg_graf_ypf <- nocs_df %>%  
  mutate(is_ypf = case_when(company == "YPF" ~ "YPF" ,
                            TRUE ~ "Other")) %>% 
  filter(tg_aftertax != 0 & fixed_assets > 0 & tg_aftertax < 1 & tg_aftertax > -20 ) %>%
  ggplot(aes(year, tg_aftertax, color = is_ypf))+
  # ggplot(aes(year, tg_aftertax, color = company, size = is_ypf))+
  geom_point(alpha = 0.6)+
  stat_smooth(level = 0.30)+
  labs(title =  "NOC's. Rentabilidad de YPF vs resto de las empresas")+
  theme(legend.position = "none")+
  scale_y_continuous(labels = scales::percent, limits = c(-0.35, 0.75))

ggplotly(tg_graf_ypf)
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
Removed 8 rows containing non-finite values (stat_smooth).
# ruta_graf_tg <- "tg_filtro_graf.png"
# png(ruta_graf_tg)
# print(tg_filtro_graf)
# dev.off()

Analisis de correlaciĂ³n

#CorrelaciĂ³n entre KTA y ganancias despuĂ©s de impuestos
cor(x = nocs_df$KTA, 
    y = nocs_df$net_income_after_tax, use = "complete.obs",
    method = "spearman")
[1] 0.7450791
#CorrelaciĂ³n entre CAPEX y ganancias despuĂ©s de impuestos
nocs_spread <- nocs_full %>% 
  select(year, company, region, country, productionGroup, indicatorName, units, observation) %>% 
  filter(units == "USD million") %>% 
  mutate(row_id = 1:nrow(.)) %>%
  spread(.,
         key = indicatorName,
         value =  observation)
 
nocs_spread_2 <- nocs_full %>%
  select(year, company, region, country, productionGroup, indicatorName, units, observation) %>% 
  filter(indicatorName %in% c("Operational expenditures", "Total revenue", 
                              "Capital expenditures", "Net income after taxes"),
         units == "USD million") %>%
  mutate(row_id = 1:nrow(.)) %>%
  spread(.,
         key = indicatorName,
         value = observation) %>%
  rename(capex = 'Capital expenditures',
         net_income = "Net income after taxes") %>% 
  group_by(company, year) %>% 
  summarise(capex = sum(capex, na.rm = T),
            net_income = sum(net_income, na.rm = T))
`summarise()` has grouped output by 'company'. You can override using the `.groups` argument.
cor(x = nocs_spread_2$capex, 
    y = nocs_spread_2$net_income, use = "complete.obs",
    method = "spearman")
[1] 0.6563327

Endeudamiento

Solvencia

\[ Solvencia = \frac{Patrimonio Neto}{Pasivo}\]

nocs_df %>% 
  ggplot(aes(year, ratio_solvencia ,group = year))+
  geom_boxplot() +
  # geom_point(aes(color = company))+
  # geom_line(aes(group = company))+
  geom_line(data = nocs_df %>% filter(company == "YPF"), 
            aes(year, ratio_solvencia,color = "blue", group = company), size = 1)+
  geom_line(data = nocs_df %>% filter(company == "PDVSA"), 
            aes(year, ratio_solvencia,color = "red", group = company), size = 1)+
  theme(legend.position = "none")+
  labs(title = "DistribuciĂ³n de ratio de solvencia para todas las empresas e YPF")


ggplot(nocs_df %>% filter(company == "YPF"))+
  geom_line( aes(year, ratio_solvencia, group = company))+
  labs(title = "Ratio de solvencia de YPF")

solvencia_graf <- nocs_df %>% 
  filter(ratio_solvencia >=0 & ratio_solvencia < 4) %>% 
  ggplot(aes(year, ratio_solvencia, color = company))+
  geom_point(alpha = 0.5)+
  labs(title =  "Ratio de solvencia todas las empresas")+
  theme(legend.position = "none")+
  # scale_y_continuous(labels = scales::percent)+
  facet_wrap(~productionGroup)
ggplotly(solvencia_graf)
solvencia_graf_2 <- nocs_df %>% 
  # filter(ratio_solvencia >=0 & ratio_solvencia < 4) %>% 
  filter(company %in% empresas_AL$company) %>% 
  ggplot(aes(year, ratio_solvencia, color = company))+
  geom_point(alpha = 0.5)+
  labs(title =  "Ratio de solvencia de empresas de AL")+
  theme(legend.position = "none")+
  # scale_y_continuous(labels = scales::percent)+
  facet_wrap(~productionGroup)

ggplotly(solvencia_graf_2)
solvencia_filtro_graf <- filtro_emp_df %>% 
  # filter(ratio_solvencia >=0 & ratio_solvencia < 4) %>% 
  ggplot(aes(year, ratio_solvencia, color = company))+
  geom_line()+
  geom_point(alpha = 1, size = 3)+
  labs(title =  "Ratio de solvencia empresas seleccionadas")+
  theme(legend.position="bottom")
  # scale_y_continuous(labels = scales::percent)+

solvencia_filtro_graf

Endeudamiento

Ratio de endeudamiento

\[ Endeudamiento = \frac{Pasivo}{Patrimonio Neto} \]


nocs_df %>% 
  ggplot(aes(year, pasivo_activo ,group = year))+
  geom_boxplot() +
  # geom_point(aes(color = company))+
  # geom_line(aes(group = company))+
  geom_line(data = nocs_df %>% filter(company == "YPF"), 
            aes(year, pasivo_activo,color = "red", group = company), size = 1)+
  theme(legend.position = "none")+
  labs(title = "DistribuciĂ³n de Pasivo/Activo de NOC's e YPF")

  # ylim(NA, 15 )

ggplot(nocs_df %>% filter(company == "YPF"))+
  geom_line( aes(year, pasivo_activo, group = company))+
  labs(title = "Pasivo/Activo de YPF")

nocs_df %>% 
  ggplot(aes(year, ratio_endeudamiento_cp ,group = year))+
  geom_boxplot() +
  # geom_point(aes(color = company))+
  # geom_line(aes(group = company))+
  geom_line(data = nocs_df %>% filter(company == "YPF"), 
            aes(year, ratio_endeudamiento_cp,color = "red", group = company), size = 1)+
  theme(legend.position = "none")+
  labs(title = "DistribuciĂ³n de ratio de endeudamiento CP de NOC's e YPF")+
  ylim(NA, 12.5 )


ggplot(nocs_df %>% filter(company == "YPF"))+
  geom_line( aes(year, ratio_endeudamiento_cp, group = company))+
  labs(title = "Ratio de endeudamiento CP de YPF")

NA
NA
endeudamiento_graf <- nocs_df %>% 
  filter(ratio_endeudamiento <10 & ratio_endeudamiento > -3 ) %>% 
  ggplot(aes(year, ratio_endeudamiento, color = company))+
  geom_point(alpha = 0.5)+
  labs(title =  "Ratio de endeudamiento todas las empresas")+
  theme(legend.position = "none")+
  # scale_y_continuous(labels = scales::percent)+
  facet_wrap(~productionGroup)
ggplotly(endeudamiento_graf)
endeudamiento_graf_al <- nocs_df %>% 
  filter(ratio_endeudamiento <30 ) %>%
  filter(company %in% empresas_AL$company ) %>% 
  ggplot(aes(year, ratio_endeudamiento, color = company))+
  geom_point(alpha = 0.5)+
  labs(title =  "Ratio de endeudamiento empresas AL")+
  theme(legend.position = "none")+
  # scale_y_continuous(labels = scales::percent)+
  facet_wrap(~productionGroup)
ggplotly(endeudamiento_graf_al)

endeudamiento_filtro_graf <- filtro_emp_df %>% 
  # filter(ratio_solvencia >=0 & ratio_solvencia < 4) %>% 
  ggplot(aes(year, ratio_endeudamiento, color = company))+
  geom_point(alpha = 1, size = 3)+
  geom_line()+
  labs(title =  "Ratio de endeudamiento empresas seleccionadas")+
  theme(legend.position="bottom")
  # scale_y_continuous(labels = scales::percent)+

endeudamiento_filtro_graf

NA
NA

Valores absolutos

endeudamiento_all <- nocs_df %>% 
  # filter(company %in% empresas_AL$company ) %>%
  ggplot(aes(year, liabilities, color = company))+
  geom_point(alpha = 0.5)+
  geom_line()+
  labs(title =  "Liabilities", y = "USD million")+
  theme(legend.position="none")+
  facet_wrap(~productionGroup)
  # scale_y_continuous(labels = scales::percent)+

ggplotly(endeudamiento_all)
endeudamiento_al <- nocs_df %>% 
  filter(company %in% empresas_AL$company ) %>%
  ggplot(aes(year, liabilities, color = company))+
  geom_point(alpha = 0.5)+
  geom_line()+
  labs(title =  "Liabilities", y = "USD million")+
  theme(legend.position="none")+
  facet_wrap(~productionGroup)
  # scale_y_continuous(labels = scales::percent)+

ggplotly(endeudamiento_al)
endeudamiento <- filtro_emp_df %>% 
  filter(company != "Resto") %>%
  ggplot(aes(year, liabilities, color = company))+
  geom_point(alpha = 1, size = 3)+
  geom_line()+
  labs(title =  "Liabilities", y = "USD million")+
  theme(legend.position="bottom")
  # scale_y_continuous(labels = scales::percent)+

endeudamiento

#cluster

data_cluster <- nocs_full %>% 
  filter(year == 2011, units == "USD million" ) %>% 
  select(company, productionGroup, indicatorName, observation) %>% 
  mutate(id = 1:nrow(.)) %>% 
  spread(key = indicatorName, value=observation) %>%
  replace(is.na(.), 0 )
  # na.omit()

# data_cluster_z <- scale(data_cluster[4:ncol(data_cluster)])

library(cluster)
datos_para_cluster = data_cluster[4:ncol(data_cluster)]

cantidad_clusters=2

CL  = kmeans(scale(datos_para_cluster),cantidad_clusters)
datos$kmeans = CL$cluster
LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBOYXRpb25hbCBPaWwgQ29tcGFueSBEYXRhYmFzZSINCmF1dGhvcjoNCi0gYWZmaWxpYXRpb246IFVOR1MvQ09OSUNFVA0KICBuYW1lOiBNYXRlbyBTdXN0ZXINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpbTGluayBOYXRpb25hbCBPaWwgQ29tcGFueSBEYXRhYmFzZV0oaHR0cHM6Ly93d3cubmF0aW9uYWxvaWxjb21wYW55ZGF0YS5vcmcvKQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCnNvdXJjZSgiZnVuY3Rpb25lc19oaWRyb2NhcmJ1cm9zLlIiKQ0Kb3B0aW9ucyAoc2NpcGVuID0gOTk5KQ0KICANCiNjYXJnbyBsYSBiYXNlDQpub2NzX2Z1bGwgPC0gcmVhZF9jc3YoICIuLi9kYXRhL25vY3MvTlJHSS1OT0NkYXRhYmFzZS1GdWxsRGF0YXNldC5jc3YiKSAlPiUgDQogICBtdXRhdGUob2JzZXJ2YXRpb24gPSBhcy5kb3VibGUob2JzZXJ2YXRpb24pLA0KICAgICAgICAgIGFuaW8gPSAoYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUoeWVhciwgb3JkZXJzICA9ICIlWSIpKSkpDQoNCmhpZHJvY2FyYnVyb3NfZGYgPC0gcmVhZF9jc3YoIi4uL2RhdGEvYmFsYW5jZXMvaGlkcm9jYXJidXJvc19kZi5jc3YiKSAlPiUgDQogIHNlbGVjdCgtIi4uLjEiKSAgDQogDQogIA0KICANCmBgYA0KDQpWYXJpYWJsZXMgcXVlIGNvbnRpZW5lIGxhIGJhc2UNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp2YXJpYWJsZXMgPSB1bmlxdWUobm9jc19mdWxsJGluZGljYXRvck5hbWUpDQp2YXJpYWJsZXMNCmBgYA0KDQpMaXN0YSBkZSB0b2RhcyBsYXMgZW1wcmVzYXMNCmBgYHtyfQ0KI2VtcHJlc2FzIGRpc3BvbmlibGVzDQp1bmlxdWUobm9jc19mdWxsJGNvbXBhbnkpDQpgYGANCg0KQ2FudGlkYWQgZGUgZW1wcmVzYXMNCmBgYHtyfQ0KbGVuZ3RoKHVuaXF1ZShub2NzX2Z1bGwkY29tcGFueSkpDQpgYGANCg0KDQpgYGB7cn0NCiNmaWx0cm8gZXhwbG9yYXRvcmlvIGRlIGVtcHJlc2FzIA0KZmlsdHJvX2VtcHJlc2FzIDwtIGMoIllQRiIsICJQZXRyb2JyYXMiLCAiWVBGQiIsICJQRFZTQSIsICJTYXVkaSBBcmFtY28iKQ0KYGBgDQoNCg0KYGBge3J9DQojZmlsdHJvIGNvbiBlbXByZXNhcyBkZSBBbcOpcmljYSBMYXRpbmENCmVtcHJlc2FzX0FMIDwtIG5vY3NfZnVsbCAlPiUgDQogIGZpbHRlcihyZWdpb24gPT0gICJMYXRpbiBBbWVyaWNhL0NhcmliYmVhbiIpICU+JSANCiAgc2VsZWN0KGNvbXBhbnksIGNvdW50cnkpIA0KZW1wcmVzYXNfQUwgPC0gZW1wcmVzYXNfQUxbIWR1cGxpY2F0ZWQoZW1wcmVzYXNfQUwpLCBdDQoNCmVtcHJlc2FzX0FMDQoNCmBgYA0KDQojIFByb2R1Y2Npw7NuDQoNCmBgYHtyfQ0KcHJvZHVjdGlvbl9ncmFmIDwtICBub2NzX2Z1bGwgJT4lIA0KICBmaWx0ZXIoaW5kaWNhdG9yTmFtZSAlaW4lIGMoIk9pbCBwcm9kdWN0aW9uIiwgIkdhcyBwcm9kdWN0aW9uIikpICU+JSANCiAgbXV0YXRlKG9ic2VydmF0aW9uID0gb2JzZXJ2YXRpb24gLyAxMDAwMDAwLA0KICAgICAgICAgaWQgPSAxOm5yb3coLikpICU+JQ0KICBncm91cF9ieShjb21wYW55LCBpbmRpY2F0b3JOYW1lLCB5ZWFyLCByZWdpb24gKSAlPiUgDQogIG11dGF0ZShvYnNlcnZhdGlvbiA9IHN1bShvYnNlcnZhdGlvbiwgbmEucm0gPSBUKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHllYXIsIG9ic2VydmF0aW9uICwgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fcG9pbnQoc2l6ZSA9IDAuOCwgYWxwaGEgPSAwLjksIGFlcyhzaGFwZSA9IGNvdW50cnkpKSsNCiAgbGFicyh0aXRsZSA9ICAiT2lsICYgZ2FzIHByb2R1Y3Rpb24iLA0KICAgICAgIHggPSAiQcOxbyIsIHkgPSAiTWlsbG9ucyBkZSBiYXJyaWxlcyBkZSBwZXRyw7NsZW8gZXF1aXZhbGVudGUvZMOtYSIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpKw0KICBmYWNldF9ncmlkKGluZGljYXRvck5hbWV+cmVnaW9uLCBsYWJlbGxlciA9IGxhYmVsX3dyYXBfZ2VuKHdpZHRoPTE3KSkNCmdncGxvdGx5KHByb2R1Y3Rpb25fZ3JhZikNCmBgYA0KDQojIEFjdGl2byB5IFBhdHJpbW9uaW8gTmV0byANCg0KYGBge3J9DQphc3NldHNfZ3JhZiA8LSAgbm9jc19mdWxsICU+JSANCiAgZmlsdGVyKGluZGljYXRvck5hbWUgJWluJSBjKCAiVG90YWwgYXNzZXRzIiksDQogICAgICAgICB5ZWFyID09IDIwMTcsIHVuaXRzID09ICJVU0QgbWlsbGlvbiIsDQogICAgICAgICAhaXMubmEob2JzZXJ2YXRpb24pKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihjb21wYW55LC1vYnNlcnZhdGlvbikgLCB5PSBvYnNlcnZhdGlvbiwgZmlsbCA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAic3RhY2siKSsNCiAgbGFicyh0aXRsZSA9ICAiVG90YWwgYXNzZXRzIiwNCiAgICAgICB4ID0gIkVtcHJlc2EiLCB5ID0gIk1NIFVTRCIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpDQogICMgZmFjZXRfZ3JpZChpbmRpY2F0b3JOYW1lfnJlZ2lvbiwgbGFiZWxsZXIgPSBsYWJlbF93cmFwX2dlbih3aWR0aD0xNykpDQpnZ3Bsb3RseShhc3NldHNfZ3JhZikNCg0KYGBgDQoNCmBgYHtyfQ0KYXNzZXRzX2dyYWYgPC0gIG5vY3NfZnVsbCAlPiUgDQogIGZpbHRlcihpbmRpY2F0b3JOYW1lICVpbiUgYyggIkVxdWl0eSIpLA0KICAgICAgICAgeWVhciA9PSAyMDE3LCB1bml0cyA9PSAiVVNEIG1pbGxpb24iLA0KICAgICAgICAgIWlzLm5hKG9ic2VydmF0aW9uKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoY29tcGFueSwtb2JzZXJ2YXRpb24pICwgeT0gb2JzZXJ2YXRpb24sIGZpbGwgPSBjb21wYW55KSkrDQogIGdlb21fY29sKHBvc2l0aW9uID0gInN0YWNrIikrDQogIGxhYnModGl0bGUgPSAgIlRvdGFsIEVxdWl0eSIsIHN1YnRpdGxlPSAiWWVhciAyMDE3IiwNCiAgICAgICB4ID0gIkVtcHJlc2EiLCB5ID0gIk1NIFVTRCIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpDQogICMgZmFjZXRfZ3JpZChpbmRpY2F0b3JOYW1lfnJlZ2lvbiwgbGFiZWxsZXIgPSBsYWJlbF93cmFwX2dlbih3aWR0aD0xNykpDQpnZ3Bsb3RseShhc3NldHNfZ3JhZikNCmBgYA0KDQojIEludmVyc2nDs24gZW4gY2FwaXRhbA0KDQoNCmBgYHtyfQ0KY2FwZXhfZ3JhZiA8LSAgbm9jc19mdWxsICU+JSANCiAgZmlsdGVyKGluZGljYXRvck5hbWUgJWluJSBjKCJDYXBpdGFsIGV4cGVuZGl0dXJlcyIpLCB1bml0cyA9PSAiVVNEIG1pbGxpb24iKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeT0gb2JzZXJ2YXRpb24sIGNvbG9yID0gY29tcGFueSkpKw0KICBnZW9tX2xpbmUoYWVzKGxpbmV0eXBlID0gY291bnRyeSkpKw0KICBsYWJzKHRpdGxlID0gICJDYXBpdGFsIGV4cGVuZGl0dXJlcyAoQ0FQRVgpIiwNCiAgICAgICB4ID0gIkHDsW8iLCB5ID0gIk1NIFVTRCIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSksDQogICAgICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpKw0KICBmYWNldF9ncmlkKH5yZWdpb24sIGxhYmVsbGVyID0gbGFiZWxfd3JhcF9nZW4od2lkdGg9MTUpKQ0KDQpnZ3Bsb3RseShjYXBleF9ncmFmKQ0KYGBgDQoNCg0KIyBSZW50YWJpbGlkYWQNCg0KIyMgRGF0YSBGcmFtZSBjb24gaW5kaWNhZG9yZXMNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiNwYXJhIGPDoWxjdWxvIGRlIHJlbnRhYmlsaWRhZA0Kbm9jc19kZiA8LSBub2NzX2Z1bGwgJT4lDQogIHNlbGVjdCh5ZWFyLCBjb21wYW55LCByZWdpb24sIGNvdW50cnksIHByb2R1Y3Rpb25Hcm91cCwgaW5kaWNhdG9yTmFtZSwgdW5pdHMsIG9ic2VydmF0aW9uKSAlPiUgDQogIGZpbHRlcihpbmRpY2F0b3JOYW1lICVpbiUgYygiTG9uZ3Rlcm0vZml4ZWQgYXNzZXRzIiwgIkNhc2ggYW5kIGNhc2ggZXF1aXZhbGVudHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXQgaW5jb21lIGFmdGVyIHRheGVzIiwgIkluY29tZSB0YXgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVxdWl0eSIsIlRvdGFsIGFzc2V0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRvdGFsIGxpYWJpbGl0aWVzIiAsICJDdXJyZW50IGxpYWJpbGl0aWVzIiApLA0KICAgICAgICAgdW5pdHMgPT0gIlVTRCBtaWxsaW9uIikgJT4lDQogIG11dGF0ZShyb3dfaWQgPSAxOm5yb3coLikNCiAgICAgICAgICMgLCBvYnNlcnZhdGlvbiA9IGFzLmRvdWJsZShvYnNlcnZhdGlvbikNCiAgICAgICAgICkgJT4lDQogIHNwcmVhZCguLA0KICAgICAgICAga2V5ID0gaW5kaWNhdG9yTmFtZSwNCiAgICAgICAgIHZhbHVlID0gb2JzZXJ2YXRpb24pICU+JSANCiAgc2VsZWN0KC1jKHJvd19pZCkpICU+JSANCiAgcmVuYW1lKCBmaXhlZF9hc3NldHMgPSAiTG9uZ3Rlcm0vZml4ZWQgYXNzZXRzIiwgY2FzaF9hbmRfZXF1aSA9ICJDYXNoIGFuZCBjYXNoIGVxdWl2YWxlbnRzIiwNCiAgICAgICAgIG5ldF9pbmNvbWVfYWZ0ZXJfdGF4ID0gIk5ldCBpbmNvbWUgYWZ0ZXIgdGF4ZXMiICwgaW5jb21lX3RheCA9ICJJbmNvbWUgdGF4IiwNCiAgICAgICAgIGVxdWl0eSA9ICJFcXVpdHkiLCAgYXNzZXRzID0gIlRvdGFsIGFzc2V0cyIsDQogICAgICAgICBsaWFiaWxpdGllcyA9ICJUb3RhbCBsaWFiaWxpdGllcyIsIGN1cnJlbnRfbGlhYmlsaXRpZXMgPSAiQ3VycmVudCBsaWFiaWxpdGllcyIpICU+JSANCiAgbXV0YXRlKG5ldF9pbmNvbWVfYWZ0ZXJfdGF4ID0gYXMuZG91YmxlKG5ldF9pbmNvbWVfYWZ0ZXJfdGF4KSwNCiAgICAgICAgIGZpeGVkX2Fzc2V0cyA9IGFzLmRvdWJsZShmaXhlZF9hc3NldHMpLA0KICAgICAgICAgY2FzaF9hbmRfZXF1aSA9IGFzLmRvdWJsZShjYXNoX2FuZF9lcXVpKSwNCiAgICAgICAgIGluY29tZV90YXggPSBhcy5kb3VibGUoaW5jb21lX3RheCksDQogICAgICAgICBlcXVpdHkgPSBhcy5kb3VibGUoZXF1aXR5KSwNCiAgICAgICAgIGxpYWJpbGl0aWVzID0gYXMuZG91YmxlKGxpYWJpbGl0aWVzKSwNCiAgICAgICAgIHllYXIgPSBwYXJzZV9kYXRlX3RpbWUoeWVhciwgb3JkZXJzID0gInkiKSkgJT4lIA0KICBncm91cF9ieSh5ZWFyLCBjb21wYW55LCBjb3VudHJ5LCByZWdpb24sIHByb2R1Y3Rpb25Hcm91cCwgdW5pdHMpICU+JQ0KICBzdW1tYXJpc2UoZml4ZWRfYXNzZXRzID0gc3VtKGZpeGVkX2Fzc2V0cywgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGNhc2hfYW5kX2VxdWkgPSBzdW0oY2FzaF9hbmRfZXF1aSwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIG5ldF9pbmNvbWVfYWZ0ZXJfdGF4ID0gc3VtKG5ldF9pbmNvbWVfYWZ0ZXJfdGF4LCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgaW5jb21lX3RheCA9IHN1bShpbmNvbWVfdGF4LCBuYS5ybSA9ICBUKSwNCiAgICAgICAgICAgIGFzc2V0cyA9IHN1bShhc3NldHMsIG5hLnJtID0gIFQpLA0KICAgICAgICAgICAgbGlhYmlsaXRpZXMgPSBzdW0obGlhYmlsaXRpZXMsIG5hLnJtID0gIFQpLA0KICAgICAgICAgICAgY3VycmVudF9saWFiaWxpdGllcyA9IHN1bShjdXJyZW50X2xpYWJpbGl0aWVzLCBuYS5ybSA9ICBUKSwNCiAgICAgICAgICAgIGVxdWl0eSA9IHN1bShlcXVpdHksIG5hLnJtID0gIFQpLA0KICAgICAgICAgICAgS1RBID0gY2FzaF9hbmRfZXF1aSArIGZpeGVkX2Fzc2V0cywNCiAgICAgICAgICAgIHRnX2JlZm9yZXRheCA9IChpbmNvbWVfdGF4ICsgbmV0X2luY29tZV9hZnRlcl90YXgpIC8gS1RBLA0KICAgICAgICAgICAgdGdfYWZ0ZXJ0YXggPSBuZXRfaW5jb21lX2FmdGVyX3RheCAvIEtUQSwNCiAgICAgICAgICAgIHJhdGlvX2VuZGV1ZGFtaWVudG8gPSBsaWFiaWxpdGllcyAvIGVxdWl0eSwgDQogICAgICAgICAgICByYXRpb19lbmRldWRhbWllbnRvX2NwID0gY3VycmVudF9saWFiaWxpdGllcy9lcXVpdHksDQogICAgICAgICAgICBwYXNpdm9fYWN0aXZvID0gbGlhYmlsaXRpZXMvYXNzZXRzLA0KICAgICAgICAgICAgcmF0aW9fc29sdmVuY2lhID0gIGVxdWl0eSAvbGlhYmlsaXRpZXMpIA0KDQojIG5vY3NfZGYgJT4lIGFycmFuZ2UoLXRnX2FmdGVydGF4KSAlPiUgDQojICAgc2VsZWN0KGNvbXBhbnksIEtUQSwgdGdfYWZ0ZXJ0YXgpDQoNCm5vY3NfZGYNCndyaXRlLmNzdihub2NzX2RmLCAiLi4vcmVzdWx0YWRvcy9jb21wYXJhY2lvbl9wYWlzZXMvbm9jcy5jc3YiLCByb3cubmFtZXMgPSBGKQ0KDQoNCm5vY3NfZGZbc2FwcGx5KG5vY3NfZGYsIGlzLmluZmluaXRlKV0gPC0gTkENCg0KDQpgYGANCg0KIyMgUmVudGFiaWxpZGFkIG1lZGlhIGRlIGxhIHJhbWENCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0Z19tZWRpYSA8LSBub2NzX2RmICU+JQ0KICAgIGdyb3VwX2J5KHllYXIpICU+JSANCiAgICBzdW1tYXJpc2UoDQogICAgICAgICAgICAgICAgICB0Z19tZWRpYV9iZWZvcmVfdGF4ID0gc3VtKGluY29tZV90YXgsIG5ldF9pbmNvbWVfYWZ0ZXJfdGF4LCBuYS5ybSA9ICBUKS8gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShmaXhlZF9hc3NldHMsIGNhc2hfYW5kX2VxdWksIG5hLnJtID0gVCksDQogICAgICAgICAgICAgICAgICB0Z19tZWRpYV9hZnRlcl90YXggPSBzdW0obmV0X2luY29tZV9hZnRlcl90YXgsIG5hLnJtID0gIFQpIC8gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShmaXhlZF9hc3NldHMsIGNhc2hfYW5kX2VxdWksIG5hLnJtID0gVCkpICU+JSANCiAgICAgICAgICAgICAgICAgICMgdGdfbWVkaWFfYmVmb3JlX3RheF9tZWFuID0gc3VtKG1lYW4oaW5jb21lX3RheCwgbmEucm0gPSAgVCksIA0KICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihuZXRfaW5jb21lX2FmdGVyX3RheCwgbmEucm0gPSBUKSwgbmEucm0gPSBUKS8gDQogICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0obWVhbihmaXhlZF9hc3NldHMsIG5hLnJtID0gVCksIA0KICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4oY2FzaF9hbmRfZXF1aSwgbmEucm0gPSBUKSwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgICAgICAgICMgdGdfbWVkaWFfYWZ0ZXJfdGF4X21lYW4gPSBtZWFuKG5ldF9pbmNvbWVfYWZ0ZXJfdGF4LCBuYS5ybSA9IFQpLyANCiAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShtZWFuKGZpeGVkX2Fzc2V0cywgbmEucm0gPSBUKSwgDQogICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihjYXNoX2FuZF9lcXVpLCBuYS5ybSA9IFQpLCBuYS5ybSA9IFQpKSAlPiUgDQogICAgIGdhdGhlciguLA0KICAgICAgICAgICAgICAga2V5ID0gdmFyaWFibGUsDQogICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLCANCiAgICAgICAgICAgICAgIDI6MykgDQogICAgIyBtdXRhdGUobWV0b2RvID0gY2FzZV93aGVuKCBzdHJfc3ViKHZhcmlhYmxlWy0zXSkpKQ0KICAgICAgICAgICAgICAgIA0KDQp0Z19tZWRpYV9ncmFmIDwtIHRnX21lZGlhICU+JSANCiAgIyBmaWx0ZXIodmFyaWFibGUgPT0gInRnX21lZGlhX2JlZm9yZV90YXhfbWVhbiIpICU+JSANCiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWxvciwgY29sb3IgPSB2YXJpYWJsZSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICAiTk9DJ3MuIFRhc2EgZGUgR2FuYW5jaWEgbWVkaWEiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KQ0KdGdfbWVkaWFfZ3JhZg0KICAgICANCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kbm9jc19kZl9jb25fbWVkaWEgPC0gbm9jc19kZiAlPiUgDQogIGJpbmRfcm93cyh0Z19tZWRpYSAlPiUgDQogICAgICAgICAgICAgIHNwcmVhZChrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsb3IpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGNvbXBhbnkgPSAiVEcgTWVkaWEiKSAlPiUgDQogICAgICAgICAgICAgIHJlbmFtZSh0Z19iZWZvcmV0YXggPSB0Z19tZWRpYV9iZWZvcmVfdGF4LA0KICAgICAgICAgICAgICAgICAgICAgdGdfYWZ0ZXJ0YXggPSB0Z19tZWRpYV9hZnRlcl90YXgpKSAlPiUgDQogIG11dGF0ZShpc19tZWRpYSA9IGNhc2Vfd2hlbihjb21wYW55ID09ICJURyBNZWRpYSIgfiAibWVkaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJlbXByZXNhcyIpKQ0KDQp3cml0ZS5jc3Yobm9jc19kZl9jb25fbWVkaWEsIGZpbGUgPSAiLi4vcmVzdWx0YWRvcy9jb21wYXJhY2lvbl9wYWlzZXMvbm9jc19kZl9jb25fbWVkaWEuY3N2IikNCg0KZ3JhZl9tZWRpYV9saW5lIDwtIG5vY3NfZGZfY29uX21lZGlhICU+JSANCiAgZ2dwbG90KGFlcyh5ZWFyLCB0Z19hZnRlcnRheCwgY29sb3IgPSBjb21wYW55LCBncm91cCA9IGlzX21lZGlhKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAgIk5PQydzLiBSZW50YWJpbGlkYWQgbWVkaWEgeSBkZWwgcmVzdG8gZGUgbGFzIGVtcHJlc2FzIGRlc3B1w6lzIGRlIGltcHVlc3RvcyIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LCBsaW1pdHMgPSBjKC0wLjMwLCAwLjcwKSxicmVha3MgPSBzZXEoLTAuMzAsIDAuNzAsIC4xKSkNCmdyYWZfbWVkaWFfbGluZQ0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfbWVkaWFfYm94IDwtIG5vY3NfZGYgJT4lIA0KICAjIGdncGxvdChhZXMoeWVhciwgdGdfYWZ0ZXJ0YXgsIGNvbG9yID0gY29tcGFueSwgc2l6ZSA9IGlzX21lZGlhKSkrDQogIGdncGxvdChhZXMoeWVhciwgdGdfYWZ0ZXJ0YXgsIGNvbG9yID0gY29tcGFueSwgZ3JvdXAgPSB5ZWFyKSkrDQogIGdlb21fYm94cGxvdCgpKw0KICAjIGdncGxvdChhZXMoZGF0YSA9IG5vY3NfZGZfY29uX21lZGlhICU+JSBmaWx0ZXIoY29tcGFueSA9PSAiVEcgTWVkaWEiKSwgeWVhciwgdGdfYWZ0ZXJ0YXgpKSsNCiAgIyBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICAiTk9DJ3MuIFJlbnRhYmlsaWRhZCBkZXNwdWVzIGRlIGltcHVlc3RvcyIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LCBsaW1pdHMgPSBjKC0wLjMsIC44KSwgYnJlYWtzID0gc2VxKC0wLjMsIC44LCAwLjEpKQ0KZ3JhZl9tZWRpYV9ib3gNCmBgYA0KDQoNCmBgYHtyfQ0Kc3VtbWFyeShub2NzX2RmICU+JSANCiAgZ3JvdXBfYnkoeWVhciwgcHJvZHVjdGlvbkdyb3VwKSAlPiUgDQogIHN1bW1hcmlzZSh0Z19hZnRlcnRheCA9IG1lYW4odGdfYWZ0ZXJ0YXgsIG5hLnJtID0gVCkpICU+JSANCiAgc3ByZWFkKC4sDQogICAgICAgICBrZXkgPSBwcm9kdWN0aW9uR3JvdXAsDQogICAgICAgICB2YWx1ZSA9ICB0Z19hZnRlcnRheCkpDQoNCmBgYA0KDQoNCiMjIFJlbnRhYmlsaWRhZCBzZWfDum4gdGFtYcOxbw0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRnX2dyYWZfcHJvZF9ncm91cCA8LSBub2NzX2RmICU+JSANCiAgIyBmaWx0ZXIodGdfYWZ0ZXJ0YXggIT0gMCAmIGZpeGVkX2Fzc2V0cyA+IDAgJiB0Z19hZnRlcnRheCA8IDUgJiB0Z19hZnRlcnRheCA+IC0yMCApICU+JSAgDQogIGdncGxvdChhZXMoeWVhciwgdGdfYWZ0ZXJ0YXgsIGNvbG9yID0gY29tcGFueSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICAiTk9DJ3MuIFJlbnRhYmlsaWRhZCBkZXNwdWVzIGRlIGltcHVlc3Rvcy4gRGl2aXNpw7NuIHBvciB0YW1hw7FvIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQsIGxpbWl0cyA9IGMoLTAuMywgLjgpLCBicmVha3MgPSBzZXEoLTAuMywgLjgsIDAuMjApKSsNCiAgZmFjZXRfZ3JpZCh+cHJvZHVjdGlvbkdyb3VwLCAgbGFiZWxsZXIgPSBsYWJlbF93cmFwX2dlbih3aWR0aD0xNykpDQpwbG90bHk6OmdncGxvdGx5KHRnX2dyYWZfcHJvZF9ncm91cCkNCmBgYA0KDQoNCiMjIFJlbnRhYmlsaWRhZCBzZWfDum4gcmVnacOzbg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRnX2dyYWZfeHJlZ2lvbiA8LSBub2NzX2RmICU+JSANCiAgZmlsdGVyKHRnX2FmdGVydGF4ICE9IDAgJiBmaXhlZF9hc3NldHMgPiAwICYgdGdfYWZ0ZXJ0YXggPCAxICYgdGdfYWZ0ZXJ0YXggPiAtMjAgKSAlPiUNCiAgZ2dwbG90KGFlcyh5ZWFyLCB0Z19hZnRlcnRheCwgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gICJOT0Mncy4gUmVudGFiaWxpZGFkIGRlc3B1ZXMgZGUgaW1wdWVzdG9zLiBEaXZpc2nDs24gcG9yIHJlZ2nDs25zIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICBmYWNldF9ncmlkKH5yZWdpb24sICBsYWJlbGxlciA9IGxhYmVsX3dyYXBfZ2VuKHdpZHRoPTE3KSkNCg0KcGxvdGx5OjpnZ3Bsb3RseSh0Z19ncmFmX3hyZWdpb24pDQoNCmBgYA0KDQojIyBZUEYsIFBldHJvYnJhcyB5IGVtcHJlc2FzIHNlbGVjY2lvbmFkYXMNCg0KYGBge3J9DQpmaWx0cm9fZW1wX2RmIDwtICBub2NzX2RmICAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKGNvbXBhbnkgPSBjYXNlX3doZW4oIShjb21wYW55ICVpbiUgZmlsdHJvX2VtcHJlc2FzKSB+ICJNZWRpYSAocmVzdG8gZGUgZW1wcmVzYXMpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGNvbXBhbnkpKSAlPiUgDQogIGdyb3VwX2J5KHllYXIsIGNvbXBhbnkpICU+JQ0KICBzdW1tYXJpc2UoZml4ZWRfYXNzZXRzID0gc3VtKGZpeGVkX2Fzc2V0cywgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGNhc2hfYW5kX2VxdWkgPSBzdW0oY2FzaF9hbmRfZXF1aSwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIG5ldF9pbmNvbWVfYWZ0ZXJfdGF4ID0gc3VtKG5ldF9pbmNvbWVfYWZ0ZXJfdGF4LCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgaW5jb21lX3RheCA9IHN1bShpbmNvbWVfdGF4LCBuYS5ybSA9ICBUKSwNCiAgICAgICAgICAgIGxpYWJpbGl0aWVzID0gc3VtKGxpYWJpbGl0aWVzLCBuYS5ybSA9ICBUKSwNCiAgICAgICAgICAgIGVxdWl0eSA9IHN1bShlcXVpdHksIG5hLnJtID0gIFQpLA0KICAgICAgICAgICAgS1RBID0gY2FzaF9hbmRfZXF1aSArIGZpeGVkX2Fzc2V0cywNCiAgICAgICAgICAgIHRnX2JlZm9yZXRheCA9IChpbmNvbWVfdGF4ICsgbmV0X2luY29tZV9hZnRlcl90YXgpIC8gS1RBLA0KICAgICAgICAgICAgdGdfYWZ0ZXJ0YXggPSBuZXRfaW5jb21lX2FmdGVyX3RheCAvIEtUQSwNCiAgICAgICAgICAgIHJhdGlvX2VuZGV1ZGFtaWVudG8gPSBsaWFiaWxpdGllcyAvIGVxdWl0eSwgDQogICAgICAgICAgICByYXRpb19zb2x2ZW5jaWEgPSAgZXF1aXR5IC9saWFiaWxpdGllcykNCmZpbHRyb19lbXBfZGYNCg0KDQp0Z19maWx0cm9fZ3JhZiA8LSBmaWx0cm9fZW1wX2RmICU+JSANCiAgZmlsdGVyKHRnX2FmdGVydGF4ICE9IDAgJiBmaXhlZF9hc3NldHMgPiAwICYgdGdfYWZ0ZXJ0YXggPCA1ICYgdGdfYWZ0ZXJ0YXggPiAtMjAgKSAlPiUgIA0KICBnZ3Bsb3QoYWVzKHllYXIsIHRnX2FmdGVydGF4LCBjb2xvciA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGxhYnModGl0bGUgPSAgIlJlbnRhYmlsaWRhZCIsDQogICAgICAgc3VidGl0bGUgPSAgIkVtcHJlc2FzIHNlbGVjY2lvbmFkYXMiKSsNCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICAjIGZhY2V0X3dyYXAofnByb2R1Y3Rpb25Hcm91cCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpDQoNCiAgDQpnZ3Bsb3RseSh0Z19maWx0cm9fZ3JhZikNCmBgYA0KDQpgYGB7cn0NCnRnX2dyYWZfeXBmIDwtIG5vY3NfZGYgJT4lICANCiAgbXV0YXRlKGlzX3lwZiA9IGNhc2Vfd2hlbihjb21wYW55ID09ICJZUEYiIH4gIllQRiIgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiT3RoZXIiKSkgJT4lIA0KICBmaWx0ZXIodGdfYWZ0ZXJ0YXggIT0gMCAmIGZpeGVkX2Fzc2V0cyA+IDAgJiB0Z19hZnRlcnRheCA8IDEgJiB0Z19hZnRlcnRheCA+IC0yMCApICU+JQ0KICBnZ3Bsb3QoYWVzKHllYXIsIHRnX2FmdGVydGF4LCBjb2xvciA9IGlzX3lwZikpKw0KICAjIGdncGxvdChhZXMoeWVhciwgdGdfYWZ0ZXJ0YXgsIGNvbG9yID0gY29tcGFueSwgc2l6ZSA9IGlzX3lwZikpKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC42KSsNCiAgc3RhdF9zbW9vdGgobGV2ZWwgPSAwLjMwKSsNCiAgbGFicyh0aXRsZSA9ICAiTk9DJ3MuIFJlbnRhYmlsaWRhZCBkZSBZUEYgdnMgcmVzdG8gZGUgbGFzIGVtcHJlc2FzIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQsIGxpbWl0cyA9IGMoLTAuMzUsIDAuNzUpKQ0KDQpnZ3Bsb3RseSh0Z19ncmFmX3lwZikNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCiMgcnV0YV9ncmFmX3RnIDwtICJ0Z19maWx0cm9fZ3JhZi5wbmciDQojIHBuZyhydXRhX2dyYWZfdGcpDQojIHByaW50KHRnX2ZpbHRyb19ncmFmKQ0KIyBkZXYub2ZmKCkNCg0KYGBgDQoNCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpmaWx0cm9fZW1wX2RmIDwtICBub2NzX2RmICAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKGNvbXBhbnkgPSBjYXNlX3doZW4oIShjb21wYW55ICVpbiUgZmlsdHJvX2VtcHJlc2FzKSB+ICJSZXN0byIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBjb21wYW55KSkgJT4lIA0KICBncm91cF9ieSh5ZWFyLCBjb21wYW55KSAlPiUNCiAgc3VtbWFyaXNlKGZpeGVkX2Fzc2V0cyA9IHN1bShmaXhlZF9hc3NldHMsIG5hLnJtID0gVCksDQogICAgICAgICAgICBjYXNoX2FuZF9lcXVpID0gc3VtKGNhc2hfYW5kX2VxdWksIG5hLnJtID0gVCksDQogICAgICAgICAgICBuZXRfaW5jb21lX2FmdGVyX3RheCA9IHN1bShuZXRfaW5jb21lX2FmdGVyX3RheCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGluY29tZV90YXggPSBzdW0oaW5jb21lX3RheCwgbmEucm0gPSAgVCksDQogICAgICAgICAgICBsaWFiaWxpdGllcyA9IHN1bShsaWFiaWxpdGllcywgbmEucm0gPSAgVCksDQogICAgICAgICAgICBlcXVpdHkgPSBzdW0oZXF1aXR5LCBuYS5ybSA9ICBUKSwNCiAgICAgICAgICAgIEtUQSA9IGNhc2hfYW5kX2VxdWkgKyBmaXhlZF9hc3NldHMsDQogICAgICAgICAgICB0Z19iZWZvcmV0YXggPSAoaW5jb21lX3RheCArIG5ldF9pbmNvbWVfYWZ0ZXJfdGF4KSAvIEtUQSwNCiAgICAgICAgICAgIHRnX2FmdGVydGF4ID0gbmV0X2luY29tZV9hZnRlcl90YXggLyBLVEEsDQogICAgICAgICAgICByYXRpb19lbmRldWRhbWllbnRvID0gbGlhYmlsaXRpZXMgLyBlcXVpdHksIA0KICAgICAgICAgICAgcmF0aW9fc29sdmVuY2lhID0gIGVxdWl0eSAvbGlhYmlsaXRpZXMpIA0KZmlsdHJvX2VtcF9kZg0KDQoNCnRnX3lwZl9wZXRyb2JyYXMgPC0gZmlsdHJvX2VtcF9kZiAlPiUgDQogIGZpbHRlcihjb21wYW55ICVpbiUgYygiWVBGIiAgICwgICAiUGV0cm9icmFzIikpICU+JSANCiAgZ2dwbG90KGFlcyh5ZWFyLCB0Z19hZnRlcnRheCwgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gICJUYXNhIGRlIEdhbmFuY2lhIGRlc3B1w6lzIGRlIGltcHVlc3RvcyIsDQogICAgICAgc3VidGl0bGUgPSAgIk5PQydzLiBFbXByZXNhcyBzZWxlY2Npb25hZGFzIikrDQogICMgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgIyBmYWNldF93cmFwKH5wcm9kdWN0aW9uR3JvdXApKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KQ0KDQpnZ3Bsb3RseSh0Z195cGZfcGV0cm9icmFzKQ0KYGBgDQoNCiMgQW5hbGlzaXMgZGUgY29ycmVsYWNpw7NuIA0KYGBge3J9DQojQ29ycmVsYWNpw7NuIGVudHJlIEtUQSB5IGdhbmFuY2lhcyBkZXNwdcOpcyBkZSBpbXB1ZXN0b3MNCmNvcih4ID0gbm9jc19kZiRLVEEsIA0KICAgIHkgPSBub2NzX2RmJG5ldF9pbmNvbWVfYWZ0ZXJfdGF4LCB1c2UgPSAiY29tcGxldGUub2JzIiwNCiAgICBtZXRob2QgPSAic3BlYXJtYW4iKQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfY29ycl9rdGFfZ2NpYSA8LSBub2NzX2RmICU+JQ0KICAjICBmaWx0ZXIocHJvZHVjdGlvbkdyb3VwID09ICJMYXJnZSBkb21lc3RpYyBwcm9kdWNlcnMiLA0KICAjICAgdGdfYWZ0ZXJ0YXggIT0gMCAmIGZpeGVkX2Fzc2V0cyA+IDAgJiB0Z19hZnRlcnRheCA8IDIuNSAmIHRnX2FmdGVydGF4ID4gLTIwICkgJT4lDQogIGdncGxvdChhZXMoS1RBLCBuZXRfaW5jb21lX2FmdGVyX3RheCkpKw0KICBnZW9tX3BvaW50KCkrDQogIGdlb21fc21vb3RoKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiQW7DoWxpc2lzIGRlIGNvcnJlbGFjacOzbiBlbnRyZSBpbmdyZXNvIG5ldG8geSBzdG9jayBkZSBjYXBpdGFsIiwNCiAgICAgICB4ID0gIlN0b2NrIGRlIENhcGl0YWwiLCB5ID0gIkluZ3Jlc28gTmV0byIpDQpwbG90bHk6OmdncGxvdGx5KGdyYWZfY29ycl9rdGFfZ2NpYSkNCmBgYA0KDQpgYGB7cn0NCiNDb3JyZWxhY2nDs24gZW50cmUgQ0FQRVggeSBnYW5hbmNpYXMgZGVzcHXDqXMgZGUgaW1wdWVzdG9zDQpub2NzX3NwcmVhZCA8LSBub2NzX2Z1bGwgJT4lIA0KICBzZWxlY3QoeWVhciwgY29tcGFueSwgcmVnaW9uLCBjb3VudHJ5LCBwcm9kdWN0aW9uR3JvdXAsIGluZGljYXRvck5hbWUsIHVuaXRzLCBvYnNlcnZhdGlvbikgJT4lIA0KICBmaWx0ZXIodW5pdHMgPT0gIlVTRCBtaWxsaW9uIikgJT4lIA0KICBtdXRhdGUocm93X2lkID0gMTpucm93KC4pKSAlPiUNCiAgc3ByZWFkKC4sDQogICAgICAgICBrZXkgPSBpbmRpY2F0b3JOYW1lLA0KICAgICAgICAgdmFsdWUgPSAgb2JzZXJ2YXRpb24pDQogDQpub2NzX3NwcmVhZF8yIDwtIG5vY3NfZnVsbCAlPiUNCiAgc2VsZWN0KHllYXIsIGNvbXBhbnksIHJlZ2lvbiwgY291bnRyeSwgcHJvZHVjdGlvbkdyb3VwLCBpbmRpY2F0b3JOYW1lLCB1bml0cywgb2JzZXJ2YXRpb24pICU+JSANCiAgZmlsdGVyKGluZGljYXRvck5hbWUgJWluJSBjKCJPcGVyYXRpb25hbCBleHBlbmRpdHVyZXMiLCAiVG90YWwgcmV2ZW51ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcGl0YWwgZXhwZW5kaXR1cmVzIiwgIk5ldCBpbmNvbWUgYWZ0ZXIgdGF4ZXMiKSwNCiAgICAgICAgIHVuaXRzID09ICJVU0QgbWlsbGlvbiIpICU+JQ0KICBtdXRhdGUocm93X2lkID0gMTpucm93KC4pKSAlPiUNCiAgc3ByZWFkKC4sDQogICAgICAgICBrZXkgPSBpbmRpY2F0b3JOYW1lLA0KICAgICAgICAgdmFsdWUgPSBvYnNlcnZhdGlvbikgJT4lDQogIHJlbmFtZShjYXBleCA9ICdDYXBpdGFsIGV4cGVuZGl0dXJlcycsDQogICAgICAgICBuZXRfaW5jb21lID0gIk5ldCBpbmNvbWUgYWZ0ZXIgdGF4ZXMiKSAlPiUgDQogIGdyb3VwX2J5KGNvbXBhbnksIHllYXIpICU+JSANCiAgc3VtbWFyaXNlKGNhcGV4ID0gc3VtKGNhcGV4LCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgbmV0X2luY29tZSA9IHN1bShuZXRfaW5jb21lLCBuYS5ybSA9IFQpKQ0KDQoNCg0KY29yKHggPSBub2NzX3NwcmVhZF8yJGNhcGV4LCANCiAgICB5ID0gbm9jc19zcHJlYWRfMiRuZXRfaW5jb21lLCB1c2UgPSAiY29tcGxldGUub2JzIiwNCiAgICBtZXRob2QgPSAic3BlYXJtYW4iKQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfY29ycl9rdGFfZ2NpYSA8LSBub2NzX3NwcmVhZF8yICU+JQ0KIGdncGxvdChhZXMoY2FwZXgsIG5ldF9pbmNvbWUpKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBnZW9tX3Ntb290aCgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIkFuw6FsaXNpcyBkZSBjb3JyZWxhY2nDs24gZW50cmUgaW5ncmVzbyBuZXRvIHkgQ0FQRVgiLA0KICAgICAgIHggPSAiQ0FQRVgiLCB5ID0gIkluZ3Jlc28gTmV0byIpDQpwbG90bHk6OmdncGxvdGx5KGdyYWZfY29ycl9rdGFfZ2NpYSkNCmBgYA0KDQoNCiMgRW5kZXVkYW1pZW50bw0KDQojIyBTb2x2ZW5jaWENCg0KJCQgU29sdmVuY2lhID0gXGZyYWN7UGF0cmltb25pbyBOZXRvfXtQYXNpdm99JCQNCg0KYGBge3J9DQpub2NzX2RmICU+JSANCiAgZ2dwbG90KGFlcyh5ZWFyLCByYXRpb19zb2x2ZW5jaWEgLGdyb3VwID0geWVhcikpKw0KICBnZW9tX2JveHBsb3QoKSArDQogICMgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb21wYW55KSkrDQogICMgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9saW5lKGRhdGEgPSBub2NzX2RmICU+JSBmaWx0ZXIoY29tcGFueSA9PSAiWVBGIiksIA0KICAgICAgICAgICAgYWVzKHllYXIsIHJhdGlvX3NvbHZlbmNpYSxjb2xvciA9ICJibHVlIiwgZ3JvdXAgPSBjb21wYW55KSwgc2l6ZSA9IDEpKw0KICBnZW9tX2xpbmUoZGF0YSA9IG5vY3NfZGYgJT4lIGZpbHRlcihjb21wYW55ID09ICJQRFZTQSIpLCANCiAgICAgICAgICAgIGFlcyh5ZWFyLCByYXRpb19zb2x2ZW5jaWEsY29sb3IgPSAicmVkIiwgZ3JvdXAgPSBjb21wYW55KSwgc2l6ZSA9IDEpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgcmF0aW8gZGUgc29sdmVuY2lhIHBhcmEgdG9kYXMgbGFzIGVtcHJlc2FzIGUgWVBGIikNCg0KZ2dwbG90KG5vY3NfZGYgJT4lIGZpbHRlcihjb21wYW55ID09ICJZUEYiKSkrDQogIGdlb21fbGluZSggYWVzKHllYXIsIHJhdGlvX3NvbHZlbmNpYSwgZ3JvdXAgPSBjb21wYW55KSkrDQogIGxhYnModGl0bGUgPSAiUmF0aW8gZGUgc29sdmVuY2lhIGRlIFlQRiIpDQoNCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzb2x2ZW5jaWFfZ3JhZiA8LSBub2NzX2RmICU+JSANCiAgZmlsdGVyKHJhdGlvX3NvbHZlbmNpYSA+PTAgJiByYXRpb19zb2x2ZW5jaWEgPCA0KSAlPiUgDQogIGdncGxvdChhZXMoeWVhciwgcmF0aW9fc29sdmVuY2lhLCBjb2xvciA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkrDQogIGxhYnModGl0bGUgPSAgIlJhdGlvIGRlIHNvbHZlbmNpYSB0b2RhcyBsYXMgZW1wcmVzYXMiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgIyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgZmFjZXRfd3JhcCh+cHJvZHVjdGlvbkdyb3VwKQ0KZ2dwbG90bHkoc29sdmVuY2lhX2dyYWYpDQpgYGANCmBgYHtyfQ0Kc29sdmVuY2lhX2dyYWZfMiA8LSBub2NzX2RmICU+JSANCiAgIyBmaWx0ZXIocmF0aW9fc29sdmVuY2lhID49MCAmIHJhdGlvX3NvbHZlbmNpYSA8IDQpICU+JSANCiAgZmlsdGVyKGNvbXBhbnkgJWluJSBlbXByZXNhc19BTCRjb21wYW55KSAlPiUgDQogIGdncGxvdChhZXMoeWVhciwgcmF0aW9fc29sdmVuY2lhLCBjb2xvciA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkrDQogIGxhYnModGl0bGUgPSAgIlJhdGlvIGRlIHNvbHZlbmNpYSBkZSBlbXByZXNhcyBkZSBBTCIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICAjIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICBmYWNldF93cmFwKH5wcm9kdWN0aW9uR3JvdXApDQoNCmdncGxvdGx5KHNvbHZlbmNpYV9ncmFmXzIpDQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc29sdmVuY2lhX2ZpbHRyb19ncmFmIDwtIGZpbHRyb19lbXBfZGYgJT4lIA0KICAjIGZpbHRlcihyYXRpb19zb2x2ZW5jaWEgPj0wICYgcmF0aW9fc29sdmVuY2lhIDwgNCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHllYXIsIHJhdGlvX3NvbHZlbmNpYSwgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KGFscGhhID0gMSwgc2l6ZSA9IDMpKw0KICBsYWJzKHRpdGxlID0gICJSYXRpbyBkZSBzb2x2ZW5jaWEgZW1wcmVzYXMgc2VsZWNjaW9uYWRhcyIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpDQogICMgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQoNCnNvbHZlbmNpYV9maWx0cm9fZ3JhZg0KYGBgDQojIyBFbmRldWRhbWllbnRvDQoNCiMjIyBSYXRpbyBkZSBlbmRldWRhbWllbnRvDQokJCBFbmRldWRhbWllbnRvID0gXGZyYWN7UGFzaXZvfXtQYXRyaW1vbmlvIE5ldG99ICQkDQoNCmBgYHtyfQ0KcGx0X2VuZGV1IDwtIG5vY3NfZGYgJT4lIA0KICBnZ3Bsb3QoYWVzKHllYXIsIHJhdGlvX2VuZGV1ZGFtaWVudG8gLGdyb3VwID0geWVhcikpKw0KICBnZW9tX2JveHBsb3QoKSArDQogICMgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb21wYW55KSkrDQogICMgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9saW5lKGRhdGEgPSBub2NzX2RmICU+JSBmaWx0ZXIoY29tcGFueSA9PSAiUERWU0EiKSwgDQogICAgICAgICAgICBhZXMoeWVhciwgcmF0aW9fZW5kZXVkYW1pZW50byxjb2xvciA9ICJQRFZTQSIsIGdyb3VwID0gY29tcGFueSksIHNpemUgPSAxKSsNCiAgZ2VvbV9saW5lKGRhdGEgPSBub2NzX2RmICU+JSBmaWx0ZXIoY29tcGFueSA9PSAiWVBGIiksIA0KICAgICAgICAgICAgYWVzKHllYXIsIHJhdGlvX2VuZGV1ZGFtaWVudG8sY29sb3IgPSAiWVBGIiwgZ3JvdXAgPSBjb21wYW55KSwgc2l6ZSA9IDEpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJFbXByZXNhIiwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQRFZTQSIsICJZUEYiKSwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoICAiYnJvd240IiwgImJsdWUxIikpKw0KICAgICAgICAgICAgICAgICAgICAgIyB2YWx1ZXMgPSBjKCJQRFZTQSIgPSAgInJlZCIsICJZUEYiID0gImJsdWUiKSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSYXRpbyBkZSBlbmRldWRhbWllbnRvIGRlIE5PQydzIiwgeCA9ICIiLCB5PSIiLA0KICAgICAgIHN1YnRpdGxlID0gIllQRiB5IFBEVlNBIGZyZW50ZSBhbCByZXN0byBkZSBsYSBkaXN0cmlidWNpw7NuIikrDQogIHlsaW0oLTMsIDUgKQ0KcGx0X2VuZGV1ID0gcGxvdF90aGVtZShwbHRfZW5kZXUpDQpnZ3NhdmUocGxvdCA9IHBsdF9lbmRldSwgZmlsZSA9ICIuLi9yZXN1bHRhZG9zL2NvbXBhcmFjaW9uX3BhaXNlcy9lbmRldWRhbWllbnRvX3lwZl9wZHZzYS5wbmciLCANCiAgICAgICB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KQ0KcGx0X2VuZGV1DQoNCmdncGxvdChub2NzX2RmICU+JSBmaWx0ZXIoY29tcGFueSA9PSAiWVBGIikpKw0KICBnZW9tX2xpbmUoIGFlcyh5ZWFyLCByYXRpb19lbmRldWRhbWllbnRvLCBncm91cCA9IGNvbXBhbnkpKSsNCiAgbGFicyh0aXRsZSA9ICJSYXRpbyBkZSBlbmRldWRhbWllbnRvIGRlIFlQRiIpDQoNCm5vY3NfZGYgJT4lIA0KICBnZ3Bsb3QoYWVzKCB4PXJhdGlvX2VuZGV1ZGFtaWVudG8gLCB5ID0gYXMuZmFjdG9yKHllYXIoeWVhcikpICwgZmlsbCA9IHllYXIpKSArDQogIGdncmlkZ2VzOjpnZW9tX2RlbnNpdHlfcmlkZ2VzKGFscGhhID0gMC42LCBzdGF0ID0gImJpbmxpbmUiKSsNCiAgIyBnZW9tX2RlbnNpdHkoKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSByYXRpbyBkZSBlbmRldWRhbWllbnRvIGRlIE5PQydzIikjKw0KICAjIGZhY2V0X3dyYXAofnllYXIoeWVhciksIHNjYWxlcyA9ICJmcmVlIikNCg0KIyB0YXBwbHkobm9jc19kZiRyYXRpb19lbmRldWRhbWllbnRvLCBub2NzX2RmJHllYXIsIHN1bW1hcnkpDQoNCmxpYnJhcnkoZGF0YS50YWJsZSkNCm5vY3NfZHQgPSBhcy5kYXRhLnRhYmxlKG5vY3NfZGYpDQpub2NzX2R0WywgYXMubGlzdChzdW1tYXJ5KHJhdGlvX2VuZGV1ZGFtaWVudG8pKSwgYnkgPXllYXJdDQpgYGANCg0KYGBge3J9DQoNCm5vY3NfZGYgJT4lIA0KICBnZ3Bsb3QoYWVzKHllYXIsIHBhc2l2b19hY3Rpdm8gLGdyb3VwID0geWVhcikpKw0KICBnZW9tX2JveHBsb3QoKSArDQogICMgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb21wYW55KSkrDQogICMgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9saW5lKGRhdGEgPSBub2NzX2RmICU+JSBmaWx0ZXIoY29tcGFueSA9PSAiWVBGIiksIA0KICAgICAgICAgICAgYWVzKHllYXIsIHBhc2l2b19hY3Rpdm8sY29sb3IgPSAicmVkIiwgZ3JvdXAgPSBjb21wYW55KSwgc2l6ZSA9IDEpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgUGFzaXZvL0FjdGl2byBkZSBOT0MncyBlIFlQRiIpDQogICMgeWxpbShOQSwgMTUgKQ0KDQpnZ3Bsb3Qobm9jc19kZiAlPiUgZmlsdGVyKGNvbXBhbnkgPT0gIllQRiIpKSsNCiAgZ2VvbV9saW5lKCBhZXMoeWVhciwgcGFzaXZvX2FjdGl2bywgZ3JvdXAgPSBjb21wYW55KSkrDQogIGxhYnModGl0bGUgPSAiUGFzaXZvL0FjdGl2byBkZSBZUEYiKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0Kbm9jc19kZiAlPiUgDQogIGdncGxvdChhZXMoeWVhciwgcmF0aW9fZW5kZXVkYW1pZW50b19jcCAsZ3JvdXAgPSB5ZWFyKSkrDQogIGdlb21fYm94cGxvdCgpICsNCiAgIyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvbXBhbnkpKSsNCiAgIyBnZW9tX2xpbmUoYWVzKGdyb3VwID0gY29tcGFueSkpKw0KICBnZW9tX2xpbmUoZGF0YSA9IG5vY3NfZGYgJT4lIGZpbHRlcihjb21wYW55ID09ICJZUEYiKSwgDQogICAgICAgICAgICBhZXMoeWVhciwgcmF0aW9fZW5kZXVkYW1pZW50b19jcCxjb2xvciA9ICJyZWQiLCBncm91cCA9IGNvbXBhbnkpLCBzaXplID0gMSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSByYXRpbyBkZSBlbmRldWRhbWllbnRvIENQIGRlIE5PQydzIGUgWVBGIikrDQogIHlsaW0oTkEsIDEyLjUgKQ0KDQpnZ3Bsb3Qobm9jc19kZiAlPiUgZmlsdGVyKGNvbXBhbnkgPT0gIllQRiIpKSsNCiAgZ2VvbV9saW5lKCBhZXMoeWVhciwgcmF0aW9fZW5kZXVkYW1pZW50b19jcCwgZ3JvdXAgPSBjb21wYW55KSkrDQogIGxhYnModGl0bGUgPSAiUmF0aW8gZGUgZW5kZXVkYW1pZW50byBDUCBkZSBZUEYiKQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KZW5kZXVkYW1pZW50b19ncmFmIDwtIG5vY3NfZGYgJT4lIA0KICBmaWx0ZXIocmF0aW9fZW5kZXVkYW1pZW50byA8MTAgJiByYXRpb19lbmRldWRhbWllbnRvID4gLTMgKSAlPiUgDQogIGdncGxvdChhZXMoeWVhciwgcmF0aW9fZW5kZXVkYW1pZW50bywgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpKw0KICBsYWJzKHRpdGxlID0gICJSYXRpbyBkZSBlbmRldWRhbWllbnRvIHRvZGFzIGxhcyBlbXByZXNhcyIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICAjIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICBmYWNldF93cmFwKH5wcm9kdWN0aW9uR3JvdXApDQpnZ3Bsb3RseShlbmRldWRhbWllbnRvX2dyYWYpDQpgYGANCmBgYHtyfQ0KZW5kZXVkYW1pZW50b19ncmFmX2FsIDwtIG5vY3NfZGYgJT4lIA0KICBmaWx0ZXIocmF0aW9fZW5kZXVkYW1pZW50byA8MzAgKSAlPiUNCiAgZmlsdGVyKGNvbXBhbnkgJWluJSBlbXByZXNhc19BTCRjb21wYW55ICkgJT4lIA0KICBnZ3Bsb3QoYWVzKHllYXIsIHJhdGlvX2VuZGV1ZGFtaWVudG8sIGNvbG9yID0gY29tcGFueSkpKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC41KSsNCiAgbGFicyh0aXRsZSA9ICAiUmF0aW8gZGUgZW5kZXVkYW1pZW50byBlbXByZXNhcyBBTCIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICAjIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICBmYWNldF93cmFwKH5wcm9kdWN0aW9uR3JvdXApDQpnZ3Bsb3RseShlbmRldWRhbWllbnRvX2dyYWZfYWwpDQpgYGANCg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmVuZGV1ZGFtaWVudG9fZmlsdHJvX2dyYWYgPC0gZmlsdHJvX2VtcF9kZiAlPiUgDQogICMgZmlsdGVyKHJhdGlvX3NvbHZlbmNpYSA+PTAgJiByYXRpb19zb2x2ZW5jaWEgPCA0KSAlPiUgDQogIGdncGxvdChhZXMoeWVhciwgcmF0aW9fZW5kZXVkYW1pZW50bywgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAxLCBzaXplID0gMykrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gICJSYXRpbyBkZSBlbmRldWRhbWllbnRvIGVtcHJlc2FzIHNlbGVjY2lvbmFkYXMiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQ0KICAjIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KDQplbmRldWRhbWllbnRvX2ZpbHRyb19ncmFmDQoNCg0KYGBgDQojIyMgVmFsb3JlcyBhYnNvbHV0b3MNCg0KYGBge3J9DQplbmRldWRhbWllbnRvX2FsbCA8LSBub2NzX2RmICU+JSANCiAgIyBmaWx0ZXIoY29tcGFueSAlaW4lIGVtcHJlc2FzX0FMJGNvbXBhbnkgKSAlPiUNCiAgZ2dwbG90KGFlcyh5ZWFyLCBsaWFiaWxpdGllcywgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICAiTGlhYmlsaXRpZXMiLCB5ID0gIlVTRCBtaWxsaW9uIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBmYWNldF93cmFwKH5wcm9kdWN0aW9uR3JvdXApDQogICMgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQoNCmdncGxvdGx5KGVuZGV1ZGFtaWVudG9fYWxsKQ0KYGBgDQoNCg0KYGBge3J9DQplbmRldWRhbWllbnRvX2FsIDwtIG5vY3NfZGYgJT4lIA0KICBmaWx0ZXIoY29tcGFueSAlaW4lIGVtcHJlc2FzX0FMJGNvbXBhbnkgKSAlPiUNCiAgZ2dwbG90KGFlcyh5ZWFyLCBsaWFiaWxpdGllcywgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICAiTGlhYmlsaXRpZXMiLCB5ID0gIlVTRCBtaWxsaW9uIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBmYWNldF93cmFwKH5wcm9kdWN0aW9uR3JvdXApDQogICMgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQoNCmdncGxvdGx5KGVuZGV1ZGFtaWVudG9fYWwpDQpgYGANCg0KYGBge3J9DQplbmRldWRhbWllbnRvIDwtIGZpbHRyb19lbXBfZGYgJT4lIA0KICBmaWx0ZXIoY29tcGFueSAhPSAiUmVzdG8iKSAlPiUNCiAgZ2dwbG90KGFlcyh5ZWFyLCBsaWFiaWxpdGllcywgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAxLCBzaXplID0gMykrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gICJMaWFiaWxpdGllcyIsIHkgPSAiVVNEIG1pbGxpb24iKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQ0KICAjIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KDQplbmRldWRhbWllbnRvDQoNCmBgYA0KDQoNCg0KDQoNCg0KI2NsdXN0ZXINCmBgYHtyfQ0KZGF0YV9jbHVzdGVyIDwtIG5vY3NfZnVsbCAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTEsIHVuaXRzID09ICJVU0QgbWlsbGlvbiIgKSAlPiUgDQogIHNlbGVjdChjb21wYW55LCBwcm9kdWN0aW9uR3JvdXAsIGluZGljYXRvck5hbWUsIG9ic2VydmF0aW9uKSAlPiUgDQogIG11dGF0ZShpZCA9IDE6bnJvdyguKSkgJT4lIA0KICBzcHJlYWQoa2V5ID0gaW5kaWNhdG9yTmFtZSwgdmFsdWU9b2JzZXJ2YXRpb24pICU+JQ0KICByZXBsYWNlKGlzLm5hKC4pLCAwICkNCiAgIyBuYS5vbWl0KCkNCg0KIyBkYXRhX2NsdXN0ZXJfeiA8LSBzY2FsZShkYXRhX2NsdXN0ZXJbNDpuY29sKGRhdGFfY2x1c3RlcildKQ0KDQpsaWJyYXJ5KGNsdXN0ZXIpDQpkYXRvc19wYXJhX2NsdXN0ZXIgPSBkYXRhX2NsdXN0ZXJbNDpuY29sKGRhdGFfY2x1c3RlcildDQoNCmNhbnRpZGFkX2NsdXN0ZXJzPTINCg0KQ0wgID0ga21lYW5zKHNjYWxlKGRhdG9zX3BhcmFfY2x1c3RlciksY2FudGlkYWRfY2x1c3RlcnMpDQpkYXRvcyRrbWVhbnMgPSBDTCRjbHVzdGVyDQpgYGANCg0K